﻿Imports System.Reflection

''' <summary>
''' テーブル属性読み込みクラス
''' </summary>
''' <remarks></remarks>
Public Class TableAttributeReader

    ''' <summary>
    ''' キャッシュ
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Property Caches As New Dictionary(Of Type, TableAttribute)

    ''' <summary>
    ''' キャッシュされている型を取得します
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks>デバッグ用</remarks>
    Public Shared Function GetKeys() As List(Of Type)
        Return Caches.Keys.ToList
    End Function

    ''' <summary>
    ''' テーブル属性を取得します
    ''' </summary>
    ''' <param name="t">作業対象となる型</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function Read(ByVal t As Type) As TableAttribute
#If DEBUG Then
        If t Is Nothing Then
            Throw New ArgumentException("省略できません。", "t")
        End If
#End If
        '#61 キャッシュ化しました
        If Caches.ContainsKey(t) Then Return Caches(t)

        'キャッシュがない場合は生成
        '#29 必ず上層からスキャンするようにします
        For Each item In (From el In t.GetProperties Where Caches.ContainsKey(el.PropertyType) = False AndAlso PropertyReader.IsParent(el) AndAlso el.PropertyType.Equals(el.DeclaringType) = False)
            Read(item.PropertyType)
        Next

        If Caches.ContainsKey(t) = False Then TableAttributeFactory.Instance.Create(t, Sub(item) Caches.Add(t, item))

        Return Caches(t)
    End Function

    ''' <summary>
    ''' テーブル属性を取得します
    ''' </summary>
    ''' <param name="typeFullName">作業対象となる型の完全名</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function Read(typeFullName As String) As TableAttribute
        Return (From el In Caches Where el.Key.FullName = typeFullName Select el.Value).First
    End Function

    Public Shared Sub ClearCache()
        Caches.Clear()
    End Sub

End Class
